<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
</head>

<body>
    <script>
        let arr = [1, 2, 3, 4, 4, 3, 2, 4, 3];
        // let res = [...new Set(arr)];
        //可以用展开运算符变成数组
        let res = Array.from(new Set(arr));
        //也可以用array.from变成数组
        //
        //数组去重 set结构的特点就是值永远是唯一的 所以可以用来去重
        console.log(res);

        // 1. Array.from  把类数组结构 或者带有length 的结构转化成数组 from是构造函数的方法
        // 2.Array.of()可以把一组参数转换为数组 of更方便 只要传参数就转化为数组

        // 3. Array.isArray([]);  //true 也是构造函数的方法 用来检测是否是数组
        // 还有new Array() instanceof Array也能检测数组
        //4.fill 填充数组
        // 5.copyWithin 复制数组里的某一部分 插入到数组里的某个位置
        // 第一个参数是插入的位置 第二个参数是开始复制的位置 第三个是结束的位置

        // 6.reverse（倒序）不是排序 只是颠倒数组 原数组发生改变

        // 7.sort 返回值 是排序后的数组 原数组也会发生改变
        let info = [{
            age: 19,
        }, {
            age: 20,
        }, {
            age: 6,
        }, ];
        let res1 = info.sort((a, b) => {
            return a.age - b.age;
        });
        console.log(res1);
        console.log(info);

        // 8.concat合并数组 原数组不变 返回合并后的新数组
        // 9.slice 截取数组 原数组不变 返回新的数组
        // 参数是负数 就加上数组的长度
        let numbers = [1, 2, 3, 4, 5];
        console.log(numbers.slice(-5)); //?
        console.log(numbers.slice(-5, -1)); //?
        console.log(numbers.slice(-30)); //?
        console.log(numbers.slice(-3, -5));

        // 10. splice 删除 替换 增加
        // 原数组发生改变;
        // 删除 传两个参数 开始的位置 删除的个数 返回值删除的值
        // 替换和插入 是三个甚至更多参数
        // 开始的位置 删除的长度（要插入的话第二个参数是0） 要替换或者插入的值

        // 11.indexOf 从左往右找下标
        // .lastIndexOf() 从右往左找下标
        // 如果有就返回位置 没有就返回-1

        // 12. includes 判断是否含有 返回 布尔值

        //数组高阶函数 接收一个函数作为参数

        // 13 find 查找 只要找到满足条件的就不再继续找了 返回值是找到的第一个值
        const people = [{
            name: "Nicholas3333",
            age: 30,
        }, {
            name: "Matt",
            age: 27,
        }, {
            name: "Nicholas",
            age: 29,
        }, ];
        //三个参数分别是：当前遍历的项、当前下标、原始数组。
        let p = people.find((item, index, array) => {
            console.log(item, index, array);
            return item.age > 28;
        });
        console.log(p);

        // 14 filter 过滤 筛选满足条件的 放在一个新的数组中 返回值就是筛选出来的数据
        let res2 = people.filter((i) => {
            return i.age > 28;
        });
        console.log(res2);

        // 15.findIndex 根据条件查找数组内匹配项的下标
        // 16.every 都满足就返回true
        // 17.some 有一个满足就返回true

        let res3 = people.every((i) => {
            return i.age > 20;
        });

        console.log(res3);

        // 18.map和foreach都是循环遍历
        // forEach 没有返回值 对数组循环然后做一个操作 原数组会变
        // map 对原数组进行操作 得到一个新的数组 必须有返回值

        let numbers2 = [{
            a: 1,
        }, {
            a: 2,
        }, {
            a: 3,
        }, {
            a: 4,
        }, {
            a: 5,
        }, ];

        let res4 = numbers2.map((i) => {
            return i.a * 3;
        });
        console.log(res4);
        console.log(numbers2);
        //得到一个新的数组 就用map

        numbers2.forEach((i) => {
            i.a = i.a * 3;
        });
        console.log(numbers2);
        //对原数组 改变 就用forEach
    </script>
</body>

</html>